package com.example.spider.task;

import cn.hutool.core.util.StrUtil;
import org.springframework.core.GenericTypeResolver;

import java.util.Optional;

/**
 * 爬虫结果处理器
 *
 * @author lym
 */
public interface SpiderResultHandler<T extends Task<? extends RESP_TYPE>, RESP_TYPE> {

    /**
     * 返回能否处理
     */
    default <R> boolean canHandle(Task<R> task, R result) {
        return taskType().equals(task.getClass()) && !StrUtil.isBlankIfStr(result);
    }

    /**
     * 处理结果
     *
     * @param result 爬虫结果
     */
    void handle(T task, RESP_TYPE result) throws Exception;

    @SuppressWarnings("unchecked")
    default Class<T> taskType() {
        return Optional.ofNullable(GenericTypeResolver.resolveTypeArguments(getClass(), SpiderResultHandler.class))
                .map(arr -> arr[0])
                .map(c -> (Class<T>) c)
                .orElseThrow();
    }

}
